package com.atguigu.gulimall.order.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * @author nicc
 * @version 1.0
 * @className haha
 * @date 2022-10-25 03:42
 */
@Service
public class Haha {

    //@RabbitListener(queues = "haha-q")
    public void haha(Message message, Channel channel) throws IOException {
        //获取消息回复状态
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        byte[] body = message.getBody();

        //ready：队列里面存储的未发送给消费者的消息
        //unacked: 发给消息者，消费者未回复的消息。
        // 在消费端手动ack模型下，没有ack服务器宕机，消息不会丢失

        //给服务器回复ack, 服务器即可删除这条消息
        //是否批量多个回复
        //业务成功回复ok, 否则回复失败, 消息重新放回队列
        try {
            System.out.println("收到消息 正在执行业务: " + new String(body));
            channel.basicAck(deliveryTag, false);
            //只有真正处理的消息才会被删除，否则返回队列
        } catch (IOException e) {
            //连接中断有可能出现异常, 消息不能回复
        } catch (Exception e){
            //业务问题, 消息失败重新放回队列
            channel.basicNack(deliveryTag, false, true);
        }
    }

}
